HTTP 协议(详解)
HTTP协议简介:HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(www.world wide web)服务器与本地浏览器之间传输文本的传输协议。
http请求协议与相应协议 HTTP协议包含浏览器发送数据到服务器需要遵循的请求协议与服务器发送数据到浏览器需要遵循的请求协议。 用于HTTP协议交互的信被称为报文。请求端的HTTP报文做请求报文,服务端做响应报文。 HTTP协议特性: (1)基于TCP/IP HTTP协议是基于TCP/IP协议之上的应用层协议。 (2)基于请求-响应模式 HTTP协议规定:请求从客户端发出,最后服务器端响应请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有收到请求之前不会发送响应。 HTTP协议是一种无状态短链接协议。是基于TCP/IP协议的应用层协议。 一次请求一次响应。
请求协议:
请求格式:
请求协议包括: 请求首行:请求方式 url 请求协议版本号 请求头 : key:value 请求体 :里面放数据。
总结:
a.请求协议由请求首行和请求头、请求体组成。
b.请求首行是由:请求方式(GET/POST) HTTP协议(HTTP/1.1) 请求IP地址
c.请求首行与请求头之间用一个\r\n隔开,请求头和请求体之间用两个(\r\n\r\n)隔开(每个请求头之间用一个\r\n隔开)
d.Cookie:也放在请求头中。
如果要保持连接,设置成长连接,可以加一个请求头(服务器客户端都要设置):Connection:keep-alive 服务器和客户端都要设置
请求方式: get与post请求
在服务端的存放位置: get 提交的数据会放在url(路径)之后,以?分割url和传输数据,参数之间以&相连,(一般服务端收到数据是在请求首行中。) post提交的数据会放在HTTP的请求体当中。
小结:
GET请求的数据是放在请求首行中的:
跟在请求方式后面。 所以请求首航:GET/POST 请求路径 /r/n请求地址
如果是在form表单中发送了GET请求的话,所填的数据会以xx%&xx=xx的格式挂在URL之后的。
POST请求的数据是放在请求体中的:储存格式是以xx=xx%&xx=xx的格式储存的。
响应协议:
相应协议包括: 相应首行: 协议版本(HTTP://1.1) 状态码(200) OK(状态码的原因短句)\r\n 响应头: Content-Length: 363 Content-Type: text/html 。。。 响应体:服务端发给客户端的数据。
响应状态码
状态码的值是当客户端向服务器端发送请求时,返回的请求结果。借助状态码,用户可以知道服务器端是否正常请求还是出现了状态吗200 ok ,以3位数字和原因组成。
代码演示:
wsgiref的作用
WSGI(Web Server Gateway Interface):
wsgiref模块,是python基于WSGI协议开发的服务模块。
最简单的Web应用,就是先把HTML用文件保存好。
用一个现成的HTTP服务器软件,接受用户请求,从文件中读取HTML,返回给客户端。
但是,接收HTML请求,解析HTML请求,发送HTML请求都比较费时,所以这些都可以交给基于WSGI协议的wsgiref模块来完成。
我们只需要专注于用python生成HTML文档。
from wsgiref.simple_server import make_server
def application(environ,start_response):
start_response('200 OK',([('Content-Type','text/html')]))
return [b"<a href='http://www.baidu.com'>baidu</a>"] // 给客户端返回的数据
// 接受请求的端口和IP地址,默认为本机地址,如果收到客户端请求,执行application函数
httpd = make_server('',8000,application)
// 夯住,等待客户端发送请求
httpd.serve_forever()
如果打印environ:
ctrl+f:"PATH_INFO"
打印请求路径:
path=environ.get('PATH_INFO')
print(path)
//默认是‘/’根路径。
这样就可以在application函数中判断,如果path==‘/login/’,就给客户端返回一段login.html字符串,
如果path=='/index/',就给他返回首页的index.html字符串.
**********************定义路径*******************************
urlpatterns = [
('/login/',login),
('/index/',index),
('/reg/',reg)
]
可以定义一个列表,列表中写路径与函数的对应关系,走到对应的路径,执行对应的函数。
函数可以定义。
// 获取用户访问的url
current_path = environ.get('PATH_INFO')
func = None
for key,item in urlpatterns:
if key == 'current_path':
func = item
break
//匹配上URL,执行对应函数,返回相应的html页面,否则返回404没有找的页面
if func:
ret = func()
return [ret]
else:
return [b"<h1>404</h1>"]
//优化代码,可以将所有的函数放到views文件中。
//url也可以放到urls文件中。
//在创建一个templates文件夹单存html文件。